const { User } = require('./models');
const express = require('express');
const jwt = require('jsonwebtoken');

const app = express();

// token 加密/解密秘钥
const SECRET = 'sdjsbuoaiu34roji2'


app.use(express.json());
app.use(require('cors')());
app.use(express.static('public'));

app.get('/', async (req, res) => {

	res.send("ok")
});

app.get('/api/users', async (req, res) => {
	// 同步查询所有用户
	const users = await User.find();
	res.send(users);
})

/**
 * @router POST api/users/test
 * @desc 注册接口地址
 * @access 接口是私密的
 */
app.post('/api/register', async (req, res) => {

	const user = await User.create({
		username: req.body.username,
		password: req.body.password,
	})

	res.send(user)
});

/**
 * @router POST api/users/test
 * @desc 登录接口地址
 * @access 接口是私密的
 */
app.post('/api/login', async (req, res) => {
	// 数据库同步查询用户名
	const user = await User.findOne({
		username: req.body.username
	})
	// 如果用户名不存在，就中断执行操作并返回状态码 422 和信息
	if (!user) {
		return res.status(422).send({
			message: '用户名不存在'
		})
	}

	// 同步查询密码，使用 bcrypt 包对查询结果进行密码效验
	const isPasswordValid = require('bcrypt').compareSync(
		req.body.password,
		user.password
	)
	// 如果密码错误，就中断执行操作并返回状态码 422 和信息
	if (!isPasswordValid) {
		return res.status(422).send({
			message: '密码无效'
		})
	}

	// 使用 jsonwebtoken 生成 token
	const token = jwt.sign({
		// 传入用户的唯一键 不要传入密码或重要信息
		id: String(user._id),
	}, SECRET)

	res.send({
		user,
		token
	})
});

/**
 * 定义中间件来验证客户端发送过来的 token
 * 在要验证是否登录的接口的回调函数之前传入中间件 auth 进行验证
 */
const auth = async (req, res, next) => {
	const raw = String(req.headers.authorization).split(' ').pop()
	/**
	 * 								验证并返回结果 Object/String
	 * 								第一个值传入请求中的 token
	 * 								第二个值传入之前设置好的秘钥
	 * 把 ID 从结果中解构出来
	 */
	const { id } = jwt.verify(raw, SECRET);
	// 把查询出的用户信息暂存在 req 中，方便其他接口调用
	req.user = await User.findById(id);
	// next 表示接下来要执行的东西
	next();
}

/**
 * @router POST api/users/test
 * @desc 查询用户个人信息接口地址
 * @access 接口是私密的
 */
app.get('/api/profile', auth, async (req, res) => {

	res.send(req.user)
})



app.listen(4000, () => {
	console.log('http://localhost:4000');
});
